<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<link rel="stylesheet" href="../style/journal.css" type="text/css" />
<style type="text/css"><!--
.googleadsense {
	margin: 2px;
	padding: 0px;
//--></style><script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-65008-1";
urchinTracker();
</script><title>Template Toolkit 的配置选项</title>
</head>
<body>
<a href="index.html">Journal</a>(2005) | <a href="../blog/"><b>Blog</b></a>(2006) | <a href="http://www.fayland.org/cgi-bin/random_link.pl">RandomLink</a> | <a href="AboutFayland.html">WhoAmI</a> | <a href="LiveBookmark.html">LiveBookmark</a> | <a href="http://www.fayland.org/">HomePage</a>
<p><&lt;Previous: <a href="SVN_Web.html">SVN::Web</a>&nbsp;&nbsp;>>Next: <a href="Feeder_01.html">一个简易的用 Catalyst 编写的 RSS 聚合器</a></p>
<h1>Template Toolkit 的配置选项</h1>
<div class='content'>
<p>Category: <a href='Catalyst.html'>Catalyst</a> &nbsp; Keywords: <b>Template Configuration</b></p>今天用 <a href="http://dev.catalyst.perl.org">Catalyst</a> 写一个 RSS 聚合器程序的时候，发现 <a href="http://www.template-toolkit.org">TT</a> 的配置总是出错。后来才发现原来是配置选项出了点问题。<p />原来的代码差不多是这样子的：<br /><pre>package Feeder::V::TT;<p />use strict;<br />use base 'Catalyst::View::TT';<br />use Template::Constants qw( :debug );<p />__PACKAGE__->config({<br /> &nbsp; &nbsp;# any TT configurations items go here<br /> &nbsp; &nbsp;INCLUDE_PATH => Feeder->config->{'home'} . '/templates/',<br /> &nbsp; &nbsp;POST_CHOMP   => 1,<br /> &nbsp; &nbsp;PRE_CHOMP    => 1,<br /> &nbsp; &nbsp;EVAL_PERL    => 1,<br /> &nbsp; &nbsp;PRE_PROCESS  => 'header.tt',<br /> &nbsp; &nbsp;POST_PROCESS => 'footer.tt',<br /> &nbsp; &nbsp;DEBUG        => DEBUG_PARSER | DEBUG_PROVIDER,<br /> &nbsp; &nbsp;CONTEXT      => undef,<p /> &nbsp; &nbsp;# two optional config items<br /> &nbsp; &nbsp;CATALYST_VAR => 'Catalyst',<br /> &nbsp; &nbsp;TIMER        => 1,<br />});</pre>可怎么运行都不行。试了好一会儿，后来才发现原来 <a href="http://search.cpan.org/perldoc?Template">Template</a> 的 INCLUDE_PATH 默认是用 : 来分隔多个路径的，比如：<br /><pre>INCLUDE_PATH => '/home/abw/templates:/usr/share/templates',</pre>这样就是两个路径。而我运行在 Win32 下，发现 Template 将 E:/Fayland/Feeder/templates 划分为了两个路径 E 和 /Fayland/Feeder/templates, 所以运行程序总是跳出找不到模版文件。知道原因后查了查 Perl Template Toolkit 一书，在配置里加了一句：<br /><pre>DELIMITER    => ';',</pre>这样就不是用 : 而是用 ; 来划分了。<p />这只是因为自己不熟悉 Template 的配置选项。于是就复习了一遍，将常用的几个翻译如下：<h4>ABSOLUTE</h4>指出用绝对路径的文件是否被解析。默认为 0.<br />如 /foo/bar 在 1 时为绝对路径而在 0 时为相对路径。<br />在 0 时使用类如 [% INSERT /etc/passwd %] 会出错，除非相对路径也有这文件。<h4>ANYCASE</h4>指示性关键字如 INCLUDE 是否允许小写<h4>BLOCKS</h4>此选项用于预先定义一系列模版块。<br /><pre>my $tt = Template->new({<br />    BLOCKS => {<br />        header  => 'The Header.  [% title %]',<br />        footer  => sub { return $some_output_text },<br />        another => Template::Document->new({ ... }),<br />    },<br />});</pre>Hash 的值可以是模版内容，子程序或是 <a href="http://search.cpan.org/perldoc?Template::Document">Template::Document</a><br />这样我们就可以在其他模版文件里调用它们。<h4>COMPILE_DIR/COMPILE_EXT</h4>Template 可以将模版文件编译成 Perl 文件保存以便接下来的再次调用。<br /><pre>my $tt1 = Template->new({<br />    COMPILE_DIR => '/tmp/ttc',<br />    COMPILE_EXT => '.ttc1',<br />});</pre>COMPILE_DIR 是地址，COMPILE_EXT 为后缀名。<h4>DELIMITER</h4>这就是我所碰到的问题解决方案。解释见最前面。<br /><pre># Win32 only<br />my $tt = Template->new({<br />    DELIMITER    => ';',<br />    INCLUDE_PATH => 'C:/TT2/Templates;D:/My Templates',<br />});</pre><h4>CONSTANTS</h4>编译时编译一次这些常量，而不是每次运行都编译一次。这样能稍微提高点速度。<br /><pre>my $tt = Template->new({<br />    CONSTANTS => {<br />        title   => 'A Demo Page',<br />        author  => 'Joe Random Hacker',<br />        version => 3.14,<br />    },<br />};</pre><h4>CONSTANT_NAMESPACE</h4>所有定义的 CONSTANTS 默认用 [% constants.title %] 来获得。而 CONSTANT_NAMESPACE 用来改变前缀。如：<br /><pre>CONSTANTS_NAMESPACE => 'const',</pre>后，可以用 [% const.title %] 来访问。<h4>NAMESPACE</h4>用来定义多个 CONSTANT_NAMESPACE<br /><pre>my $tt = Template->new({<br />    NAMESPACE => {<br />        site => Template:::Namespace::Constants->new({<br />            title   => "Wardley's Widgets",<br />            version => 2.718,<br />        }),<p />        author => Template:::Namespace::Constants->new({<br />            name  => 'Andy Wardley',<br />            email => 'abw@andywardley.com',<br />        }),<br />    },<br />};</pre>这样你就可以分别用 [% site.title %] 和 [% author.name %] 访问不同的常量。<h4>CONTEXT</h4>设置上下文。具体用途有点复杂。略过。<h4>DEBUG</h4>设置哪些地方需要调式。所定义的常量位于 use Template::Constants qw( :debug );<br />有两种写法：<br /><pre>DEBUG => DEBUG_PARSER | DEBUG_PROVIDER,<br /># or<br />DEBUG => 'parser, provider',<br /></pre>具体哪个啥意思查手册。<h4>DEFAULT</h4>当在 INCLUDE_PATH 里找不到模版文件时，默认调用该文件<br /><pre>my $tt = Template->new({<br />    DEFAULT => 'notfound.html',<br />});</pre><h4>ERROR/ERRORS</h4>定义一些常用的 错误 模版，然后在必要时调用它们。<br /><pre>my $tt = Template->new({<br />    ERROR => {<br />        'user.login'  => 'user/login.html',<br />        'user.passwd' => 'user/badpasswd.html',<br />        'user'        => 'user/index.html',<br />        'default'     => 'error/default',<br />    },<br />});</pre>必要时通过 [% THROW user.login 'no user id: please login' %] 来调用。<br />或在当前的 Template::Context 调用： $context->throw('user.passwd', 'Incorrect Password');<br />或在 Perl 代码中调用： die (Template::Exception->new('user.denied', 'Invalid User ID'));<h4>EVAL_PERL</h4>确定类如 PERL 或 RAWPERL 这样的块是否被执行。默认为 0<h4>FILTERS</h4>自定义自己的 filter, 过滤器。用于处理文件的某一些转换。 Template 默认自带了一些。<br /><pre>$tt = Template->new({<br />    FILTERS => {<br />        'sfilt1' =>   \&static_filter,      # static<br />        'sfilt2' => [ \&static_filter, 0 ], # same as above<br />        'dfilt1' => [ \&dynamic_filter_factory, 1 ],<br />    },<br />});</pre>而后调用<br /><pre>[% FILTER sfilt1 %]<br />Blah blah blah.<br />[% END %]</pre><h4>INCLUDE_PATH</h4>这个前面用了 n 多次了。它就是用于指定你要搜索的模版文件的文件夹。这几乎是用得最多的一个指令。<h4>START_TAG/END_TAG</h4>用以指定 template 指令的起始和终止符号。默认为 %<br /><pre>my $tt = Template->new({ <br />    START_TAG => quotemeta('<+'),<br />    END_TAG   => quotemeta('+>'),<br />});<br /></pre>这样就用 <+ INCLUDE foobar +> 而不是 [% %] 来调用指令了。<h4>INTERPOLATE</h4>内插。默认为 0<br /><pre># INTERPOLATE => 0<br />&lt;a href="http://[% server %]/[% help %]"><br />&lt;img src="[% images %]/help.gif">&lt;/a><br />[% myorg.name %]<p /># INTERPOLATE => 1<br />&lt;a href="http://$server/$help"><br />&lt;img src="$images/help.gif">&lt;/a><br />$myorg.name<br /># explicit scoping with {  }<br />&lt;img src="$images/${icon.next}.gif"><br /></pre><h4>OUTPUT/OUTPUT_PATH</h4>这个我在老版本的 Eplanet 里是常用的。可以将内容输出到文件。<h4>PRE_CHOMP, POST_CHOMP</h4>是否在 [% %] 指令前后去除空行。默认不去除。这样的话：<br /><pre>&lt;a href='[% address %]'>Click Here&lt;/a></pre>的话产生的最后结果可能是：<br /><pre>&lt;a href='<br />fayland.html<br />'>Click Here&lt;/a></pre>我喜欢将它们设置成 1, 即使有时候应该分开的行也并起来了。<h4>PRE_DEFINE, VARIABLES</h4>这两个选项是一样的。用于设置一些默认值。如果 STASH 没有设置的话采用它们，设定的话忽略。<br /><pre>my $tt = Template->new({<br />    PRE_DEFINE => {<br />        title   => 'A Demo Page',<br />        author  => 'Joe Random Hacker',<br />        version => 3.14,<br />    },<br />};</pre><h4>PRE_PROCESS, POST_PROCESS</h4>调用一个 process 模版文件时预先调用和后来调用的模版文件。一般用于放置头文件和尾文件。<br /><pre>my $tt = Template->new({<br />    PRE_PROCESS  => [ 'config', 'header' ],<br />    POST_PROCESS => 'footer',<br />};</pre><h4>STASH, process</h4>这些在 Catalyst 没用到所以也不介绍了。<h3>Enjoy!</h3>Share me what u think.</div>
<p><&lt;Previous: <a href="SVN_Web.html">SVN::Web</a>&nbsp;&nbsp;>>Next: <a href="Feeder_01.html">一个简易的用 Catalyst 编写的 RSS 聚合器</a></p>
<p><strong>Options:</strong> <a href='http://del.icio.us/post?title=Template%20Toolkit%20%E7%9A%84%E9%85%8D%E7%BD%AE%E9%80%89%E9%A1%B9&url=http://www.fayland.org/journal/Template_Configuration.html'>+Del.icio.us</a></p>
<strong>Related items</strong>
<ul><li><a href='template_introduction.html'>Template Toolkit 入门</a> < <span class='digit'>2005-12-03 18:15:26</span> ></li><li><a href='Template_builtin_Filters.html'>Template builtin Filters</a> < <span class='digit'>2005-12-09 23:14:04</span> ></li><li><a href='Template_customized_Filte.html'>Template customized Filters</a> < <span class='digit'>2005-12-10 01:10:15</span> ></li><li><a href='Accessing_External_TTFile.html'>导入 Template Toolkit 文件</a> < <span class='digit'>2005-12-10 22:42:16</span> ></li><li><a href='Proxy_automatic_configura.html'>自动代理配置</a> < <span class='digit'>2005-11-20 14:26:15</span> ></li></ul>
Created on <span class="digit">2005-10-24 20:23:23</span>, Last modified on <span class="digit">2005-11-25 11:47:12</span><br />
Copyright 2004-2005 All Rights Reserved. Powered by <a href="Eplanet.html">Eplanet</a> && <a href='http://catalyst.perl.org'>Catalyst</a> 5.62.
</body>
</html>